package pruebas;
import junit.framework.TestCase;
import java.util.ArrayList;
import juego.Avioneta;
import juego.Botin;
import juego.Energia;
import juego.Impacto;
import juego.Movil;
import juego.Coordenada;
import juego.Laser;
import juego.Cohete;
import juego.Explorador;
import juego.Caza;
import juego.Bombardero;
import juego.AvionCivil;
import juego.Torpedo;

public class TestAvioneta extends TestCase {
	
	public void testProvocarHuida(){
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada coordNave = new Coordenada(0,0);
		Avioneta unaNave = new Avioneta(coordNave);
		unaNave.designarGuia();
		
		Coordenada coordLaser = new Coordenada(15,0);
		Laser unLaser = new Laser(coordLaser);
		
		Coordenada coordCohete = new Coordenada(15,0);
		Cohete unCohete = new Cohete(coordCohete);
		
		unLaser.hacerLeal();
		
		unCohete.hacerLeal();
		
		Coordenada coordEnemigo1 = new Coordenada(50,50);
		Explorador enemigo1 = new Explorador(coordEnemigo1);
		
		Coordenada coordEnemigo2 = new Coordenada(40,50);
		Caza enemigo2 = new Caza(coordEnemigo2);
		
		Coordenada coordEnemigo3 = new Coordenada(30,50);
		Avioneta enemigo3 = new Avioneta(coordEnemigo3);
		
		Coordenada coordEnemigo4 = new Coordenada(20,50);
		Bombardero enemigo4 = new Bombardero(coordEnemigo4);
	
		AvionCivil amigo1 = new AvionCivil(-100,-100);
		
		Coordenada coordAmigo2 = new Coordenada(100,100);
		Laser amigo2 = new Laser(coordAmigo2);
		amigo2.hacerLeal();
		
		Coordenada coordEnemigo5 = new Coordenada(10,50);
		Laser enemigo5 = new Laser(coordEnemigo5);
		
		listaDeObjetos.add(amigo1);
		listaDeObjetos.add(enemigo1);
		listaDeObjetos.add(enemigo3);
		listaDeObjetos.add(unLaser);
		listaDeObjetos.add(unaNave);
		listaDeObjetos.add(enemigo4);
		listaDeObjetos.add(enemigo5);
		listaDeObjetos.add(amigo2);
		listaDeObjetos.add(enemigo2);
		listaDeObjetos.add(unCohete);
		
		//Destruccion
		unaNave.vivir(listaDeObjetos,listaDeBotines);
		assertFalse(listaDeObjetos.contains(unaNave)); 
		assertFalse(listaDeObjetos.contains(unLaser)); 
		assertFalse(listaDeObjetos.contains(unCohete)); 
		
		//Huida
		//Siguen igual
		amigo1.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord1 = amigo1.verUbicacion();
		int x1 = coord1.obtenerCoordenadaX();
		int y1 = coord1.obtenerCoordenadaY();
		assertTrue(x1 == (-95));
		assertTrue(y1 == (-100));
		
		amigo2.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord2 = amigo2.verUbicacion();
		int x2 = coord2.obtenerCoordenadaX();
		int y2 = coord2.obtenerCoordenadaY();
		assertTrue(x2 == (100));
		assertTrue(y2 == (110));
		
		enemigo5.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord3 = enemigo5.verUbicacion();
		int x3 = coord3.obtenerCoordenadaX();
		int y3 = coord3.obtenerCoordenadaY();
		assertTrue(x3 == (10));
		assertTrue(y3 == (40));
		
		//Huyen
		enemigo1.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord4 = enemigo1.verUbicacion();
		int x4 = coord4.obtenerCoordenadaX();
		int y4 = coord4.obtenerCoordenadaY();
		assertTrue(x4 == (50));
		assertTrue(y4 == (60));
		
		enemigo2.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord5 = enemigo2.verUbicacion();
		int x5 = coord5.obtenerCoordenadaX();
		int y5 = coord5.obtenerCoordenadaY();
		assertTrue(x5 == (40));
		assertTrue(y5 == (60));
		
		enemigo3.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord6 = enemigo3.verUbicacion();
		int x6 = coord6.obtenerCoordenadaX();
		int y6 = coord6.obtenerCoordenadaY();
		assertTrue(x6 == (30));
		assertTrue(y6 == (65));
		
		enemigo4.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord7 = enemigo4.verUbicacion();
		int x7 = coord7.obtenerCoordenadaX();
		int y7 = coord7.obtenerCoordenadaY();
		assertTrue(x7 == (20));
		assertTrue(y7 == (55));
		
	}
	
	public void testColision(){
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Avioneta exp = new Avioneta(0,0);
		
		Coordenada coordH2 = new Coordenada(15,0);
		Laser h2 = new Laser(coordH2);
		
		Coordenada coordH3 = new Coordenada(32,0);
		Laser h3 = new Laser(coordH3);
		
		h2.hacerLeal();
		h3.hacerLeal();
		
		listaDeObjetos.add(exp);
		listaDeObjetos.add(h2);
		listaDeObjetos.add(h3);
		
		int puntaje = (exp.vivir(listaDeObjetos,listaDeBotines));
		assertTrue(listaDeObjetos.contains(exp));
		assertFalse(listaDeObjetos.contains(h2));
		assertTrue(puntaje == 0);
		
		int puntaje2 = (exp.vivir(listaDeObjetos,listaDeBotines));
		assertFalse(listaDeObjetos.contains(exp));
		assertFalse(listaDeObjetos.contains(h3));
		assertTrue(puntaje2 == 20);
	}
	
	public void testColisionFuerzaAmigo(){
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada coordExp = new Coordenada(0,0);
		Avioneta exp = new Avioneta(coordExp);
		
		Coordenada coordH2 = new Coordenada(15,0);
		Laser h2 = new Laser(coordH2);
		
		Coordenada coordH3 = new Coordenada(32,0);
		Laser h3 = new Laser(coordH3);
		
		listaDeObjetos.add(exp);
		listaDeObjetos.add(h2);
		listaDeObjetos.add(h3);
		
		int puntaje = (exp.vivir(listaDeObjetos,listaDeBotines));
		assertTrue(listaDeObjetos.contains(exp));
		assertTrue(listaDeObjetos.contains(h2));
		assertTrue(puntaje == 0);
		
		int puntaje2 = (exp.vivir(listaDeObjetos,listaDeBotines));
		assertTrue(listaDeObjetos.contains(exp));
		assertTrue(listaDeObjetos.contains(h3));
		assertTrue(puntaje2 == 0);
	}

	public void testDisparar() {
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		Coordenada coordExp = new Coordenada(0,0);
		Avioneta exp = new Avioneta(coordExp);
		listaDeObjetos.add(exp);
		exp.vivir(listaDeObjetos,listaDeBotines);
		Movil unElemento = listaDeObjetos.get(0);
		Coordenada coord = unElemento.verUbicacion();
		int x = coord.obtenerCoordenadaX();
		int y = coord.obtenerCoordenadaY();
		assertTrue(x == (15));
		assertTrue(y == (0));
	}
	
	public void testDisparar2() {
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada coordExp = new Coordenada(0,0);
		Avioneta exp = new Avioneta(coordExp);
		listaDeObjetos.add(exp);
		
		//Originalmente la nave es el unico elemento en la lista
		assertTrue((listaDeObjetos.size()) == 1); 
		
		//Como dispara aumenta la cantidad de elementos en la lista
		exp.vivir(listaDeObjetos,listaDeBotines);
		assertTrue((listaDeObjetos.size()) == 2);
		
		//La siguiente vez no dispara, por lo 
		//que la cantidad de objetos de mantiene igual
		exp.vivir(listaDeObjetos,listaDeBotines);
		assertTrue((listaDeObjetos.size()) == 2); 

		//A la 2da vez vuelve a disparar, entonces
		//aumenta el numero de elementos otra vez
		exp.vivir(listaDeObjetos,listaDeBotines);
		assertTrue((listaDeObjetos.size()) == 3);
		
	}
	
	public void testDispararMuerto() {
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		Coordenada coordExp = new Coordenada(0,0);
		Avioneta exp = new Avioneta(coordExp);
		listaDeObjetos.add(exp);
		Coordenada coordP1 = new Coordenada(15,0);
		Torpedo p1 = new Torpedo(coordP1);
		p1.hacerLeal();
		listaDeObjetos.add(p1);
		exp.vivir(listaDeObjetos,listaDeBotines);	
		assertTrue((listaDeObjetos.size()) == 0);	
	}
	
	public void testImpactoProvocado(){
		
		Movil movil = new Avioneta(0,8);
		Energia energia = new Energia(30);
		Impacto impacto = movil.impactoProvocado();
		impacto.herir(energia);
		assertEquals(20, energia.verEnergia());
		
	};

	public void testMovimiento(){
		ArrayList<Movil> listaDeObjetos = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada coordH1 = new Coordenada(0,0);
		Avioneta h1 = new Avioneta(coordH1);
		listaDeObjetos.add(h1);
		
		h1.vivir(listaDeObjetos,listaDeBotines);
		Coordenada coord1 = h1.verUbicacion();
		int x1 = coord1.obtenerCoordenadaX();
		int y1 = coord1.obtenerCoordenadaY();
		assertTrue(x1 == (15));
		assertTrue(y1 == (0));
		
		for (int i=1;i<10;i++){
			h1.vivir(listaDeObjetos,listaDeBotines);}
		Coordenada coord2 = h1.verUbicacion();
		int x2 = coord2.obtenerCoordenadaX();
		int y2 = coord2.obtenerCoordenadaY();
		assertTrue(x2 == (150));
		assertTrue(y2 == (0));
		
		for (int i=1;i<11;i++){
			h1.vivir(listaDeObjetos,listaDeBotines);}
		Coordenada coord3 = h1.verUbicacion();
		int x3 = coord3.obtenerCoordenadaX();
		int y3 = coord3.obtenerCoordenadaY();
		assertTrue(x3 == (0));
		assertTrue(y3 == (0));
		
		for (int i=1;i<11;i++){
			h1.vivir(listaDeObjetos,listaDeBotines);}
		Coordenada coord4 = h1.verUbicacion();
		int x4 = coord4.obtenerCoordenadaX();
		int y4 = coord4.obtenerCoordenadaY();
		assertTrue(x4 == (150));
		assertTrue(y4 == (0));
		
		for (int i=1;i<11;i++){
			h1.vivir(listaDeObjetos,listaDeBotines);}
		Coordenada coord5 = h1.verUbicacion();
		int x5 = coord5.obtenerCoordenadaX();
		int y5 = coord5.obtenerCoordenadaY();
		assertTrue(x5 == (0));
		assertTrue(y5 == (0));
		
	}
	
}
	
